﻿//
// Copyright (c) 2024 BPer
//
#include <bperrtp/BPerRtpPacket.h>

#include <bperrtp/BPerRtp.h>
#include <bperrtp/BPerRtpConstant.h>
#include <bperrtp/BPerRtpRawPayload.h>
#include <bperrtp/BPerRtpFUAPayload2.h>
#include <bperrtp/BPerRtpSTAPPayload.h>

#include <bperutil/sys/BPerLog.h>
#include <bperutil/BPerAvInfoType.h>



void bPer_create_rtpPacket(BPerRtpPacket* pkt){
	bPer_memset(&pkt->header,0,sizeof(BPerRtpHeader));
	pkt->payload_type = BPerRtpPacketPayloadTypeUnknown;
	pkt->actual_buffer_size = 0;

	pkt->nalu_type = BPerAvcNaluTypeReserved;
	pkt->frame_type = BPerFrameTypeAudio;
	pkt->cached_payload_size = 0;

	pkt->payload=NULL;

	pkt->nb=0;
}
void bPer_destroy_rtpPacket(BPerRtpPacket* pkt){
	if(pkt==NULL) return;
	if(pkt) bPer_free(pkt->header.extensions);
}
void bPer_reset_rtpPacket(BPerRtpPacket* pkt){
	if(pkt==NULL) return;
	bPer_free(pkt->header.extensions);
	bPer_memset(&pkt->header,0,sizeof(BPerRtpHeader));
	pkt->payload_type = BPerRtpPacketPayloadTypeUnknown;
	pkt->actual_buffer_size = 0;

	pkt->nalu_type = BPerAvcNaluTypeReserved;
	pkt->frame_type = BPerFrameTypeAudio;
	pkt->cached_payload_size = 0;

	pkt->payload=NULL;
	pkt->nb=0;
}


int32_t bPer_decode_rtpPacket(BPerRtpPacket* pkt,BPerBuffer *buf) {
	if(pkt==NULL) return 1;
	int32_t err = BPer_Ok;

	if ((err = bPer_decode_rtpHeader(buf,&pkt->header)) != BPer_Ok) {
		return bPer_error_wrap(err, "rtp header");
	}


	uint8_t padding = pkt->header.padding_length;
	if (!bPer_buffer_require(buf,padding)) {
		return bPer_error_wrap(err, "requires padding %d bytes", padding);
	}
	buf->size=buf->size - padding;
	pkt->payload=buf->head;
	pkt->nb=bPer_buffer_left(buf);
    pkt->payload_type = BPerRtpPacketPayloadTypeRaw;

	return err;
}


char* bPer_wrap_rtpPacket(BPerRtpPacket* pkt,BPerRtpBuffer* rtpb,char* data,int32_t nb){
	if(pkt==NULL) return NULL;
	pkt->actual_buffer_size=nb;

	char* p=bPer_get_rtpBuffer(rtpb);
	bPer_memcpy(p,data,nb);
	return p;
}

void bPer_rtpPacket_set_padding(BPerRtpPacket* pkt,int32_t size) {
	if(pkt==NULL) return ;
	pkt->header.padding_length=size;
	if (pkt->cached_payload_size) {
		pkt->cached_payload_size += size - pkt->header.padding_length;
	}
}

void bPer_rtpPacket_add_padding(BPerRtpPacket* pkt,int32_t size) {
	if(pkt==NULL) return ;
	pkt->header.padding_length=pkt->header.padding_length + size;
	if (pkt->cached_payload_size) {
		pkt->cached_payload_size += size;
	}
}


